package sistemaDistribuido.sistema.clienteServidor.modoMonitor;
/**
 * Autor: Navarro Nu�ez, Deric de Jesus
 * Seccion: D04 
 */
import java.io.IOException;
import java.net.*;
import java.util.*;

public class Buzon extends Thread{
    // <editor-fold defaultstate="collapsed" desc="Variables...">
    MicroNucleo micro;
    private Hashtable<Integer, Vector> tablabuzones;
    private Vector <correo> buzon= new Vector<correo>();
    private correo mail;
    // </editor-fold>
    public Buzon(MicroNucleo MN) {
        this.micro = MN;
        tablabuzones=new Hashtable<Integer, Vector>();
        start();
    }
    public void llegaCorreo(int dest, byte[] mensaje) {
        if (tablabuzones.containsKey(dest)) {
            buzon = tablabuzones.get(dest);
            mail=new correo(dest,mensaje);
            buzon.add(mail);
            tablabuzones.put(dest, buzon);
            micro.imprimeln("Mensaje agregado a buzon.");
        } else {
            buzon= new Vector<correo>();
            mail=new correo(dest,mensaje);
            buzon.add(mail);
            tablabuzones.put(dest,buzon);
            micro.imprimeln("Buzon nuevo y mensaje agregado.");
        }
        micro.imprimeln("Numero de buzon: " + dest);
        micro.imprimeln("Numero de mail en buzon: " + tablabuzones.get(dest).size());
        System.out.println("Numero de buzon: " + dest);
        System.out.println("Numero de mail en buzon: " + tablabuzones.get(dest).size());
        System.out.println("--------------------------------------------------------------------------");
    }
    public void atiendeCorreo(int dest, byte[] mensaje) {
        String ip=null;
        
        ParMaquinaProceso pmp  = micro.sendTable.get(dest); 
        if (micro.sendTable.containsKey(dest)) {
            micro.imprimeln("yuju voy a: "+dest);
            int destino;
            destino = dest;
            ip = pmp.dameIP();
            micro.sendTable.remove(dest);
        }
        DatagramSocket socketEmision = micro.dameSocketEmision();
     
        try {
            DatagramPacket dataPack = new DatagramPacket(mensaje, mensaje.length,InetAddress.getByName(pmp.dameIP()), micro.damePuertoRecepcion());
            
            micro.imprimeln("enviando Mensaje");
            socketEmision.send(dataPack);
        } catch (SocketException e) {
        } catch (UnknownHostException e) {
        } catch (IOException e) {
        }
    }
    @Override
    public void run() {
        while (true) {
            Enumeration<Integer> claves = tablabuzones.keys();
            while(claves.hasMoreElements()){
                Integer dest=(Integer)claves.nextElement();
                if(micro.receiveTable.containsKey(dest)){
                    buzon = tablabuzones.get(dest);
                    mail=buzon.firstElement();
                    buzon.remove(buzon.firstElement());
                    atiendeCorreo(mail.dameDestino(),mail.dameMensaje());
                    if(buzon.isEmpty()){
                        tablabuzones.remove(dest);
                    }
                    break;
                }
            }
            try {
                sleep(15000);
            } catch (InterruptedException e) {}
        }
    }
}
class correo {
    private int dest;
    private byte[] mensaje;
    public correo(int dest, byte[] mensaje){
        this.dest=dest;
        this.mensaje=mensaje;
    }
    public int dameDestino() {
        return dest;
    }
    public byte[] dameMensaje() {
        return mensaje;
    }
    public void cambiaDestino(int dest) {
        this.dest = dest;
    }
    public void cambiaMensaje(byte[] mensaje) {
        this.mensaje = mensaje;
    }
}